#-*- coding: utf-8 -*-

# 第三方库
import wx
import win32api
import sys
import wx.lib.agw.aui as aui
from wx.adv import Animation,AnimationCtrl

import threading

# 自己实现的模块
from word2pdf import doc2pdf
import defines as CMD


'''开始正式逻辑编写'''

# 文件拖拽
class FileDrop( wx.FileDropTarget ):
    def __init__(self, panel, statusText):
        wx.FileDropTarget.__init__(self)
        self.text=statusText
        self.panel=panel

    def OnDropFiles(self, x, y, filePath):
        path = filePath[0]
        # print(filePath)
        filePath_w2p = path #文件路径
        self.text.Label="选中文件路径：\n"+path
        
        return True


# UI窗口
class mainFrame(wx.Frame):
    '''程序主窗口类，继承自wx.Frame'''
    
    # 全局变量
    id_open = wx.NewId()
    id_save = wx.NewId()
    id_quit = wx.NewId()
    id_help = wx.NewId()
    id_about = wx.NewId()
    
    id_CutPdf = wx.NewId()
    id_word2PDF = wx.NewId()
    id_PDF2word = wx.NewId()
    id_other = wx.NewId()
    fileName=""

    def __init__(self, parent):
        wx.Frame.__init__(self,parent,-1,CMD.APP_TITLE)
        self.SetBackgroundColour(wx.Colour(224, 224, 224))
        self.SetSize((600, 400))
        self.Resizable=-1
        self.Center()

        # icon
        ''' hasattr(object, name)判断object对象中是否存在name属性，当然对于python的对象而言，
        属性包含变量和方法；有则返回True，没有则返回False；需要注意的是name参数是string类型，
        所以不管是要判断变量还是方法，其名称都以字符串形式传参；getattr和setattr也同样；
        获取object对象的属性的值，如果存在则返回属性值，如果不存在分为两种情况，一种是没有
        default参数时，会直接报错；给定了default参数，若对象本身没有name属性，则会返回给定的
        default值；如果给定的属性name是对象的方法，则返回的是函数对象，需要调用函数对象来获得
        函数的返回值；调用的话就是函数对象后面加括号，如func之于func();
        另外还需要注意，如果给定的方法func()是实例函数，则不能写getattr(A, 'func')()，因为fun()
        是实例函数的话，是不能用A类对象来调用的，应该写成getattr(A(), 'func')()；实例函数和类函数的区别可以简单的理解一下，
        实例函数定义时，直接def func(self):，这样定义的函数只能是将类实例化后，用类的实例化对象来调用；'''
        if hasattr(sys,"frozen") and getattr(sys,"frozen") == "windows_exe":
            exeName = win32api.GetModuleFileName(win32api.GetModuleHandle(None))
            icon = wx.Icon(exeName, wx.BITMAP_TYPE_ICO)
        else :
            icon = wx.Icon(CMD.APP_ICON, wx.BITMAP_TYPE_ICO)
        self.SetIcon(icon)

        # toolBar工具栏
        self.toolBar1 = self.CreateTB('F')
        self.toolBar2 = self.CreateTB()

        # 面板嵌板，按要求分左中下三大部分
        p_left = wx.Panel(self, -1)
        p_center = wx.Panel(self, -1)
        p_bottom = wx.Panel(self, -1)
        p_center.SetBackgroundColour("White")
        p_bottom.SetBackgroundColour("White")
        
        # 提示文本
        statusText0 = wx.StaticText(p_left, -1, CMD.STATUS, pos=(0, 10), size=(200, 200), style=wx.ALIGN_LEFT)        
        statusText1 = wx.StaticText(p_bottom, -1, "将文件拖曳到此开始实现文件转PDF", pos=(5, 10), size=(200, 200), style=wx.ALIGN_LEFT)
        filepathText0 = wx.StaticText(p_center, -1, "", pos=(5, 10), size=(500, -1), style=wx.ALIGN_LEFT)
        
        #文件拖曳
        fileDrop = FileDrop(p_center,filepathText0)
        p_bottom.SetDropTarget( fileDrop)
        
        convertButton = wx.Button(p_left, -1, u'开始转换', pos=(30,230), size=(100, -1))
        #　lambda表达式，可以理解为匿名函数，冒号：前是参数，而：冒号后是表达式即具体的操作
        convertButton.Bind(wx.EVT_BUTTON, lambda e, mark=filepathText0, panel=p_center: self.OnSwitch(e, mark,panel))
        
        text0 = wx.StaticText(p_center, -1, u'状态：文件转PDF', pos=(0, 170), size=(400, 40), style=wx.ALIGN_CENTER)
        
        # 使用ui管理器设置工具条，并设置行列，位置以及浮动性
        self._mgr = aui.AuiManager()
        self._mgr.SetManagedWindow(self)
        
        self._mgr.AddPane(self.toolBar1, 
            aui.AuiPaneInfo().Name("ToolBar1").Caption(u"工具条").ToolbarPane().Top().Row(0).Position(0).Floatable(False)
        )
        self._mgr.AddPane(self.toolBar2, 
            aui.AuiPaneInfo().Name("ToolBar2").Caption(u"工具条").ToolbarPane().Top().Row(0).Position(1).Floatable(True)
        )
        # self._mgr.AddPane(self.tbv, 
            # aui.AuiPaneInfo().Name("ToolBarV").Caption(u"工具条").ToolbarPane().Right().Floatable(True)
        # )
        
        # 设置宽度可变性以及最小宽度等等
        self._mgr.AddPane(p_left,
            aui.AuiPaneInfo().Name("LeftPanel").Left().Layer(1).MinSize((200,-1)).Caption(u"操作区").MinimizeButton(True).MaximizeButton(True).CloseButton(True)
        )
        self._mgr.AddPane(p_center,
            aui.AuiPaneInfo().Name("CenterPanel0").CenterPane().Show()
        )
        self._mgr.AddPane(p_bottom,
            aui.AuiPaneInfo().Name("BottomPanel").Bottom().MinSize((-1,100)).Caption(u"消息区").CaptionVisible(False).Resizable(True)
        )
        # 更新界面
        self._mgr.Update()
    
    
    '''通过这个函数来更新当前文件名'''
    def setText(self, content):
        self.fileName=content
    

    '''通过这个函数来创建工具栏具体'''
    def CreateTB(self, d='H'):  # 默认d即模式是H，即水平，而V是垂直
        '''创建工具栏'''
        
        # 为按钮初始化位图信息
        if d.upper()=='F':
            bmp_open = wx.Bitmap('res/cut.png', wx.BITMAP_TYPE_ANY)    
        else:
            bmp_open = wx.Bitmap('res/file.png', wx.BITMAP_TYPE_ANY)
        bmp_save = wx.Bitmap('res/convert.png', wx.BITMAP_TYPE_ANY)
        bmp_help = wx.Bitmap('res/1.png', wx.BITMAP_TYPE_ANY)
        bmp_about = wx.Bitmap('res/menu.png', wx.BITMAP_TYPE_ANY)
        
        
        if d.upper() in ['V', 'VERTICAL']:
            tb = aui.AuiToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, agwStyle=aui.AUI_TB_TEXT|aui.AUI_TB_VERTICAL)
        else:
            tb = aui.AuiToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, agwStyle=aui.AUI_TB_TEXT)
        tb.SetToolBitmapSize(wx.Size(16, 16))       # 位图大小如16×16
        
        # 添加工具栏按钮，即元素
        if(d.upper() == 'F'):
            tb.AddSimpleTool(self.id_CutPdf, u'PDF拆分', bmp_open, u'PDF拆分')
            tb.AddSimpleTool(self.id_word2PDF, u'word转PDF', bmp_save, u'word转PDF')
            tb.AddSeparator()
            tb.AddSimpleTool(self.id_PDF2word, u'PDF转word', bmp_help, u'PDF转word')
            tb.AddSimpleTool(self.id_other, u'其他', bmp_about, u'其他')
            wx.EVT_TOOL( self, self.id_CutPdf, self.cutPDF )
            wx.EVT_TOOL( self, self.id_word2PDF, self.word_PDF )
            wx.EVT_TOOL( self, self.id_PDF2word, self.PDF_word )
            wx.EVT_TOOL( self, self.id_other, self.other )
        else:
            tb.AddSimpleTool(self.id_open, u'打开', bmp_open, u'打开文件')
            tb.AddSimpleTool(self.id_save, u'保存', bmp_save, u'保存文件')
            tb.AddSeparator()
            tb.AddSimpleTool(self.id_help, u'教程', bmp_help, u'帮助')
            tb.AddSimpleTool(self.id_about, u'关于', bmp_about, u'关于')
            wx.EVT_TOOL( self, self.id_open, self.OnOpenDirectory )
            wx.EVT_TOOL( self, self.id_save, self.saveFile )
            wx.EVT_TOOL( self, self.id_help, self.help )
            wx.EVT_TOOL( self, self.id_about, self.about )

        #　应用到toolBar
        tb.Realize()
        return tb
        
    
    '''点击按钮  开始转换   的响应函数'''
    def OnSwitch(self, evt, filepathText0, panel):
        path=filepathText0.Label.split("\n")[1]    #获得文件路径，因为提示语加了换行符
        
        # 要确保有选中的文件
        if  path== "":
            d=wx.MessageDialog(None, u"请先选择文件再点击转换哦", u"提示", wx.YES_NO | wx.ICON_QUESTION)
            if d.ShowModal()==wx.ID_OK:
                pass
            d.Destroy()
            return

        convertText0 = wx.StaticText(panel, -1, "转换中···", pos=(80, 72), size=(72, -1), style=wx.ALIGN_CENTER)
        convertText0.SetBackgroundColour("White")

        # 通过这个来播放gif动画
        animation = AnimationCtrl(panel, -1, Animation('res/5.gif'), pos=(80, 90))    # 创建一个动画
        animation.Play()    # 播放动图

        # 开始具体的操作，封装的函数功能
        self.word2PDF(path)  #开始转换
        animation.Stop()    # 操作结束时停止gif播放
        convertText0.Show(0)
        animation.Destroy()
            
        
    '''PDF的切割函数'''
    def cutPDF(self, evt):
        print("当前处于PDF切割")
        # self._mgr.Update()
    
    '''word转PDF'''
    def word_PDF(self, evt):
        print("点击了word转PDF")

    '''word转PDF'''
    def PDF_word(self, evt):
        print("点击了PDF转word")

    '''other'''
    def other(self, evt):
        print("点击了其他")

    '''保存文件'''
    def saveFile(self, evt):
        print("点击了保存文件")

    '''帮助'''
    def help(self, evt):
        print("点击了帮助")
    
    '''word转PDF'''
    def about(self, evt):
        print("点击了关于")

    '''通过调用fileDialog来打开系统文件库'''
    def OnOpenDirectory(self, event):
        '''
        打开开文件对话框
        '''
        dlg = wx.FileDialog(self,u"选择文件夹",style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            #print(dlg.GetPath()) #文件夹路径
            filePath_w2p=dlg.GetPath()
            self.word2PDF(filePath_w2p)
            
        dlg.Destroy()   # 及时关闭提示窗口
    

    '''PDF拆分函数'''
    # def cutPDF(self,filePath):
    #     pass
        

    '''文档转PDF的尝试函数'''
    def word2PDF(self, filePath):
        flag=1
        # flag=0  #flag
        # doc2pdf(filePath)
        # dlg = wx.MessageDialog(None, u"确认将文件转为pdf?", u"提示", wx.YES_NO | wx.ICON_QUESTION)
        # if dlg.ShowModal() == wx.ID_YES:
            # flag=1
        # dlg.Destroy()
        
        result=1
        if flag==1:
            # t = threading.Thread(target=doc2pdf(filePath))
            # print("开启线程")
            # t.start()
            # result=0
            result = doc2pdf(filePath)
        if result==1:
            d=wx.MessageDialog(None, u"转换失败，可能已经存在该PDF文件", u"提示", wx.YES_NO | wx.ICON_QUESTION)
            if d.ShowModal()==wx.ID_OK:
                pass
            d.Destroy()
        else:
            pass
            # d=wx.MessageDialog(None, u"转换成功", u"提示", wx.YES_NO | wx.ICON_QUESTION)
            # if d.ShowModal()==wx.ID_OK:
                # pass
            # d.Destroy()
        
class mainApp(wx.App):
    def OnInit(self):
        self.SetAppName(CMD.APP_TITLE)
        self.Frame = mainFrame(None)
        self.Frame.Show()
        return True

if __name__ == "__main__":
    app = mainApp()         # 实例化UI界面
    app.MainLoop()          # 要用MainLoop来持续展现画面
